package com.powernode.dataservice.service;

import com.powernode.api.model.BidInfo;
import com.powernode.api.model.IncomeRecord;
import com.powernode.api.model.ProductInfo;
import com.powernode.api.service.IncomeService;
import com.powernode.constants.YLBConstants;
import com.powernode.dataservice.mapper.BidInfoMapper;
import com.powernode.dataservice.mapper.IncomeRecordMapper;
import com.powernode.dataservice.mapper.ProductInfoMapper;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@DubboService(interfaceClass = IncomeService.class,version = "1.0.0")
public class IncomeServiceImpl implements IncomeService {

    @Autowired
    private ProductInfoMapper productInfoMapper;

    @Autowired
    private BidInfoMapper bidInfoMapper;

    @Autowired
    private IncomeRecordMapper incomeRecordMapper;

    /*生成收益计划*/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void generateIncomePlan() {
        /*1获取 昨天 满标的产品 */
        Date now = new Date();
        /* 开始 时间  昨天开始  截取天  默认 0时0分0秒  先减  再 截取*/
        Date statDate = DateUtils.truncate(DateUtils.addDays(now,-1), Calendar.DATE);
        /*结束时间  今天  默认 0时0分0秒*/
        Date endDate = DateUtils.truncate(now, Calendar.DATE);
        /*查询数据库获取 昨天(时间范围  2022-8-25 0:0:0   -   2022-8-26 0:0:0) 满标的产品 集合*/
        List<ProductInfo> fullProductList = productInfoMapper.selectFullProduct(statDate,endDate);


        /*遍历满标产品集合*/
        for (ProductInfo productInfo:fullProductList) {
            /*根据 产品 id 查 记录 获取 满标产品的  投标记录*/
            List<BidInfo> bidInfoList = bidInfoMapper.selectFullByProductId(productInfo.getId());
            /* 日利率= 年利率数字/100/360  divide 除   10, RoundingMode.HALF_UP 精确到 小数点后 10位 */
            BigDecimal dayRate = productInfo.getRate().divide(new BigDecimal("100"),10, RoundingMode.HALF_UP)
                                    .divide(new BigDecimal("360"),10,RoundingMode.HALF_UP);



            /*每一个 投资记录 生成 一个 收益计划    遍历*/
            for (BidInfo bidInfo :bidInfoList
                 ) {
                /*获取 产品的 满标时间  加上  期限   收益到期时间*/
                /*不同的产品 期限单位不一样*/
                Date incomeDate= null;
                BigDecimal incomeMoney =null;
                /*收益时间 等于 满标时间  +  期限  +1*/
                if (productInfo.getProductType()==YLBConstants.PRODUCT_TYPE_XINSHOUBAO){
                    /*以 天为单位*/
                    incomeDate = DateUtils.addDays(productInfo.getProductFullTime(),productInfo.getCycle()+1);
                    incomeMoney = bidInfo.getBidMoney().multiply(dayRate).multiply(new BigDecimal(productInfo.getCycle()));
                }else {
                    /*以月为单位*/
                    incomeDate = DateUtils.addDays(productInfo.getProductFullTime(),productInfo.getCycle()*30+1);
                    incomeMoney = bidInfo.getBidMoney().multiply(dayRate).multiply(new BigDecimal(productInfo.getCycle()*30));
                }
                /*获取 每个 订单的 收益  利息 = 本金*日利率*天数   */

                /*根据 投标记录 生成 收益计划*/
                IncomeRecord incomeRecord = new IncomeRecord();
                incomeRecord.setUid(bidInfo.getUid());
                incomeRecord.setBidId(bidInfo.getId());
                incomeRecord.setProdId(productInfo.getId());
                incomeRecord.setBidMoney(bidInfo.getBidMoney());//本金
                incomeRecord.setIncomeStatus(YLBConstants.INCOME_STATUS_PLAN);
                /*到期时间*/
                incomeRecord.setIncomeDate(incomeDate);
                /*利息*/
                incomeRecord.setIncomeMoney(incomeMoney);
                incomeRecordMapper.insertSelective(incomeRecord);
            }
            /*当 当前产品的所有 投资记录都生成了 收益计划 后  状态  要从  满标状态  改为  已生成收益*/
            int rows = productInfoMapper.updateStatus(productInfo.getId(),YLBConstants.PRODUCT_STATUS_PLAN);
            if (rows<1){
                System.out.println("更新失败");
                throw new RuntimeException("更新产品状态失败");
            }
            System.out.println("更新成功");
        }
    }
}
